package br.com.eventime.dao;

import java.io.Serializable;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;


public abstract class GenericDao<T, E extends Serializable> implements Serializable {
	
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@PersistenceContext(unitName = "EventimePU")
	protected EntityManager em;
	
	
	public T merge(T entidade){
		em.merge(entidade);
		return entidade;
	}
	
	@SuppressWarnings("unchecked")
	public void delete(T entidade, E chave){
		entidade = (T) em.getReference(entidade.getClass(), chave);
		em.remove(entidade);
	}
	
	public T find(Class<T> clazz,E chave){
		return em.find(clazz,chave);
	}
	
	@SuppressWarnings("unchecked")
	public T findSingleResult(String namedQuery,Parametros<?> ... parametros) {
		try {
			Query query = em.createNamedQuery(namedQuery);
			if(parametros != null) {
				for (Parametros<?> item : parametros){
					if(item != null)
					query.setParameter(item.getNome(), item.getValor());
				}
			}
			return (T) query.getSingleResult();
		}catch (Exception e){
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<T> findToList(String namedQuery, Parametros<?> ... parametros){
		Query query = em.createNamedQuery(namedQuery);
		if(parametros != null) {
			for (Parametros<?> item : parametros){
				if(item != null)
				query.setParameter(item.getNome(), item.getValor());
			}
		}
		return query.getResultList();
	}

	public void setEm(EntityManager em) {
		this.em = em;
	}

}
